#ifndef RELAY_H
#define RELAY_H

#include "PreIdentifiedObject.h"
#include "SimEngine/Polynomial.h"
#include <boost/smart_ptr.hpp>
#include <math.h>

namespace Jano
{

class Relay;
/**
    Alias na zręczny wskaźnik dla Relay.
*/
typedef boost::shared_ptr<Relay> RelaySPtr;

class Relay
{

private:
    unsigned int m_state;   // Zmienna
    double m_smallOffset;   //Zakres zmian pętli histerezy dla mniejszych przedziałów
    double m_bigOffset;     //Zakres zmian pętli histerezy dla większych przedziałów
    Jano::PreIdentifiedObject m_SelectedModel;                      // Aktualnie wybrany modelu
    std::vector<Jano::PreIdentifiedObject> m_PreIdentifiedModels;   // Wektor modeli zależnych od zakresów

    /**
      Metoda umożliwiająca inicjalizację listy zidentyfikowanych modeli
      */
    void InitializeModels();
    /*double roundPV(double pv, double precision);*/

public:
    /**
      Konstrukotr ustawiający podstawowe własności przełącznika z histerezą.
      \param bigRange zakres histeresy dla większych przedziałów
      \param smallRange zakres histerezy dla mniejszych przedziałów
      */
    Relay(double bigRange, double smallRange);

    /**
      Ustawienie zakresu histerezy dla większych przedziałów.
      \param range zakres histerezy.
      */
    void setBigRange(double range);

    /**
      Ustawienie zakresu histerezy dla mniejszych przedziałów.
      \param range zakres histerezy.
      */
    void setSmallRange(double range);

    /**
      Wybór zidentyfikowanego modelu w zalezności od wartości wyjściowej obiektu
      \param PV wartość wyjścia obiektu
    */
    void SelectModel(double PV);

    /**
      Dostęp do wybranego modelu w ramach algorytmu.
      \return wybrany model
      */
    Jano::PreIdentifiedObject getSelectedModel();

    /**
      Reset parametrów przekaźnika z histerezą.
      */
    void reset();
};
}

#endif // RELAY_H
